# 通常情况下，定义函数时都会选择有参数的函数形式，函数参数的作用是传递数据给函数，令其对接收的数据做具体的操作处理。
#
# 在使用函数时，经常会用到形式参数（简称“形参”）和实际参数（简称“实参”），二者都叫参数，之间的区别是：
#
# 形式参数：在定义函数时，函数名后面括号中的参数就是形式参数，例如:
# 定义函数时，这里的函数参数 obj 就是形式参数
def demo(obj):
    obj += obj
    print("形参值为：", obj)


# 实际参数：在调用函数时，函数名后面括号中的参数称为实际参数，也就是函数的调用者给函数的参数。例如:
a = "C语言中文网"

# 调用已经定义好的 demo 函数，此时传入的函数参数 a 就是实际参数
demo(a)

# 实参和形参的区别，就如同剧本选主角，剧本中的角色相当于形参，而演角色的演员就相当于实参。

# 明白了什么是形参和实参后，再来想一个问题，那就是实参是如何传递给形参的呢？
#
# Python 中，根据实际参数的类型不同，函数参数的传递方式可分为 2 种，分别为值传递和引用（地址）传递：
#
#   值传递：适用于实参类型为不可变类型（字符串、数字、元组）；
#   引用（地址）传递：适用于实参类型为可变类型（列表，字典）；
#
# 值传递和引用传递的区别是，函数参数进行值传递后，若形参的值发生改变，不会影响实参的值；而函数参数继续引用传递后，改变形参的值，实参的值也会一同改变。


print("-------值传递-----")
a = "C语言中文网"
print("a的值为：", a)
demo(a)
print("实参值为：", a)
print("-----引用传递-----")
a = [1, 2, 3]
print("a的值为：", a)
demo(a)
print("实参值为：", a)


# 分析运行结果不难看出，在执行值传递时，改变形式参数的值，实际参数并不会发生改变；而在进行引用传递时，改变形式参数的值，实际参数也会发生同样的改变。
#
# Python函数参数的值传递机制
#
#   所谓值传递，实际上就是将实际参数值的副本（复制品）传入函数，而参数本身不会受到任何影响。
#
#   传入函数的是实际参数值的复制品，不管在函数中对这个复制品如何操作，实际参数值本身不会受到任何影响。

# 测试值传递
def swap(x, y):
    x, y = y, x
    print("swap 函数中 a 的值：{:d}，b 的值：{:d} ".format(x, y))


x1 = 12
y1 = 13
swap(x1, y1)
print(x1, y1)


